<?php
/**
 * 异常处理器类
 * 用于统一处理应用中的各种异常
 */
namespace core;

class ExceptionHandler {
    /**
     * 处理异常
     * @param \Exception $e 异常对象
     */
    public static function handle(\Exception $e) {
        if ($e instanceof AppException) {
            self::handleAppException($e);
        } else {
            self::handleSystemException($e);
        }
    }

    /**
     * 处理应用异常
     * @param AppException $e 应用异常对象
     */
    protected static function handleAppException(AppException $e) {
        http_response_code($e->getCode());
        
        // 记录异常信息
        Debug::error('应用异常: ' . $e->getMessage() . '<br>');
        Debug::log('异常代码: ' . $e->getCode() . '<br>');
        Debug::log('异常数据: ' . print_r($e->getData(), true) . '<br>');
        Debug::log('异常堆栈: ' . $e->getTraceAsString() . '<br>');
        
        // 根据请求类型返回不同格式
        if (isset($_SERVER['HTTP_ACCEPT']) && strpos($_SERVER['HTTP_ACCEPT'], 'application/json') !== false) {
            header('Content-Type: application/json');
            echo json_encode([
                'code' => $e->getCode(),
                'message' => $e->getMessage(),
                'data' => $e->getData(),
                'trace' => Config::get('app_debug') ? $e->getTrace() : []
            ]);
        } else {
            // HTML格式响应
            if (Config::get('app_debug')) {
                // 开发模式显示详细错误信息
                echo '<pre>'.htmlspecialchars($e->__toString()).'</pre>';
            } else {
                // 生产模式显示友好错误页面
                switch ($e->getCode()) {
                    case 404:
                        echo '页面不存在';
                        break;
                    case 403:
                        echo '权限不足';
                        break;
                    default:
                        echo '系统错误: ' . $e->getMessage();
                        break;
                }
            }
        }
    }

    /**
     * 处理系统异常
     * @param \Exception $e 系统异常对象
     */
    protected static function handleSystemException(\Exception $e) {
        // 设置HTTP响应码为500
        http_response_code(500);
        
        // 记录异常信息
        Debug::error('系统异常: ' . $e->getMessage() . '<br>');
        Debug::log('异常堆栈: ' . $e->getTraceAsString() . '<br>');
        
        // 输出错误信息
        echo '系统异常';
    }
}